package com.tzbank.filter;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;

import com.alibaba.fastjson.JSONObject;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.http.ServletInputStreamWrapper;
import com.tzbank.utils.ResultUtil;
import com.tzbank.utils.StringUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * @author liweibin
 *   公共参数处理方法
 */
@Slf4j
@Component
public class ParamsFilter extends ZuulFilter{

    /**
     * pre 可以在请求被路由之前调用
     * route 在路由请求时被调用
     * post 在route和error过滤之后被调用
     * error 处理请求时发生错误时被调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";   //请求路由前调用
    }

    @Override
    public int filterOrder() {
        return 1;   //执行顺序 数字越大级别越低
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();		//获取请求上下文
        ctx.getResponse().setCharacterEncoding("UTF-8");				//设置编码
        HttpServletRequest request = ctx.getRequest();
        //temp  进行视频相关接口释放
        try {
        	//获取请求中的参数体
			String reqBody = StreamUtils.copyToString((InputStream) request.getInputStream(), Charset.forName("UTF-8"));
			log.info("=============》reqBody传递的数据：" + reqBody);
			//判断是否包含用form提交的文件数据，有的话直接返回
	        if(reqBody.contains("form-data")) {
	        	return null;
	        }
	        JSONObject reqJsonObj = null ;
	        try {
	        	reqJsonObj =JSONObject.parseObject(reqBody);		//数据格式化
			} catch (Exception e) {
				e.printStackTrace();		//格式化异常
				return null;	
			}
			
	        //GET请求没数据
	        if(reqJsonObj == null) {
	        	return null;
	        }
	        
			//判断是否已经按照新的参数方式进行传参了
			if(reqJsonObj.get("params") != null) {
				String paramsStr =String.valueOf(reqJsonObj.get("params"));
				reqJsonObj =JSONObject.parseObject(paramsStr);		//进行剥离params组装
			}
			log.info(reqJsonObj.toString());
			
			//对前端传的baseInfo 设备基础信息进行解析
			Map<String,String> baseInfoMap = null;
			Object baseInfo =  reqJsonObj.get("baseInfo");			//取出基础数据
			if(baseInfo == null) {
				//设置编码   先释放掉baseInfo的强制验证         以后要加回去
				//ctx.setSendZuulResponse(false);
	            //ctx.setResponseBody(JSONObject.fromObject(ResultUtil.resultMap("缺少基础信息数据", "600", null)).toString());
	            return null;
			}
			try {
				baseInfoMap = (Map<String, String>) JSONObject.parse(String.valueOf(baseInfo));		//对象转换
			} catch (Exception e) {
				e.printStackTrace();
				ctx.setSendZuulResponse(false);
	            ctx.setResponseBody(JSONObject.toJSONString((ResultUtil.resultMap("baseInfo格式不对", "601", null))));
	            return null;
			}
			reqJsonObj.remove("baseInfo");		//移除
			reqJsonObj.putAll(baseInfoMap);		//对象合并
			
			//添加消费方交易号
			String consumerSeqNo = StringUtils.getUUID();
			reqJsonObj.put("consumerSeqNo", consumerSeqNo);
			
			//重置新的请求体数据
			final byte[] reqBodyBytes = reqJsonObj.toString().getBytes();
			ctx.setRequest(new HttpServletRequestWrapper(request) {
                @Override
                public ServletInputStream getInputStream() throws IOException {
                    return new ServletInputStreamWrapper(reqBodyBytes);
                }

                @Override
                public int getContentLength() {
                    return reqBodyBytes.length;
                }

                @Override
                public long getContentLengthLong() {
                    return reqBodyBytes.length;
                }
            });
			
		} catch (IOException e) {
			log.info("公共参数处理方法", e);
			ctx.setSendZuulResponse(false);
            ctx.setResponseBody(JSONObject.toJSONString((ResultUtil.resultMap("baseInfo格式不对", "601", null))));
            return null;
		}
        return null;
    }
    
    public static void main(String[] args) {
		
    	JSONObject reqJsonObj = new JSONObject();
    	reqJsonObj.put("aa", "bb");
    	reqJsonObj.get("bb");
	}
    
}
